package jmine.tec.web.servlet.util;

import javax.servlet.ServletContext;
import javax.servlet.jsp.PageContext;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * Classe utilitaria para ser usada em componenetes ou tags JSF que precisam acessar beans do spring.
 * 
 * @author Piercio
 */
public class WebSpringHelper {

    /**
     * Devolve bean do spring com o nome e tipo passados, para se usado em uma tag.
     * 
     * @param <T> tipo de bean.
     * @param clazz classe do bean.
     * @param pageContext page context.
     * @param name nome de bean.
     * @return bean pedido.
     */
    public static <T> T getBean(PageContext pageContext, String name, Class<T> clazz) {
        ServletContext context = pageContext.getServletContext();
        return getBean(context, name, clazz);
    }

    /**
     * Devolve bean do spring com o nome e tipo passados.
     * 
     * @param <T> tipo de bean.
     * @param clazz classe do bean.
     * @param context servlet context.
     * @param name nome de bean. <code>false</code> caso o nome passado ja seja o nome do bean do spring.
     * @return bean pedido.
     */
    @SuppressWarnings("unchecked")
    protected static <T> T getBean(ServletContext context, String name, Class<T> clazz) {
        String beanName = context.getInitParameter(name);
        return (T) getBeanFactory(context).getBean(beanName == null ? name : beanName);
    }

    /**
     * @param context o servlet context.
     * @return bean factory do spring.
     */
    public static BeanFactory getBeanFactory(ServletContext context) {
        return WebApplicationContextUtils.getWebApplicationContext(context);
    }

    /**
     * Apenas para o checkstyle nao reclamar... {@inheritDoc}
     * 
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return super.toString();
    }

}
